package com.zh.seckill.config;

import com.zh.seckill.pojo.User;
import com.zh.seckill.service.UserService;
import com.zh.seckill.util.CookieUtil;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户参数解析器类，用于将HTTP请求中的用户信息解析成User对象
 * 实现了HandlerMethodArgumentResolver接口，用于Spring MVC的参数解析机制
 */
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    /**
     * UserService的资源注入，用于操作用户相关数据
     */
    @Resource
    private UserService userService;

    /**
     * 判断当前要解析的参数类型是否为需要解析的类型
     *
     * @param parameter 方法参数对象，用于获取参数类型
     * @return 如果参数类型为User.class，则返回true，表示需要解析此参数
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 获取参数类型
        Class<?> aClass = parameter.getParameterType();
        return aClass == User.class;
    }

    /**
     * 解析用户参数的具体实现
     * 从HTTP请求中提取用户信息，并通过UserService获取用户对象
     *
     * @param parameter 方法参数对象，用于标识需要解析的参数
     * @param mavContainer ModelAndViewContainer对象，用于添加模型属性和视图
     * @param webRequest WebRequest对象，用于访问HTTP请求和响应
     * @param binderFactory WebDataBinderFactory对象，用于创建数据绑定器
     * @return 解析得到的User对象，如果解析失败则返回null
     * @throws Exception 解析过程中可能抛出的异常
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

        // 获取HttpServletRequest和HttpServletResponse对象
//        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
//        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
//
//        // 从HTTP请求的Cookie中获取用户认证票据
//        String ticket = CookieUtil.getCookieValue(request, "userTicket");
//        // 如果票据为空，则返回null，表示未找到用户信息
//        if (!StringUtils.hasText(ticket)) {
//            return null;
//        }
//        // 从Redis中获取用户信息，通过UserService完成
//        return userService.getUserByCookie(ticket, request, response);

        return UserContext.getUser();
    }
}


